from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View
from django.contrib.auth import authenticate, login, logout


class RegisterView(View):
    def get(self, request):
        state = request.GET.get('state', '')
        print('GET请求 state=', state)
        # 传递context来填充模板(结合一个给定的模板和一个给定的上下文字典，并返回一个渲染后的 HttpResponse 对象)
        return render(request, 'register.html', {'state': state})

    def post(self, request):
        """处理POST请求"""

        # 1、接收请求参数，用户名、密码和确认密码
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        check_password = request.POST.get('check_password', '')
        # 2、校验请求参数
        # 判断两次密码是否一致
        if password != check_password:
            state = '两次密码输入不一致,请重新输入!'
            return render(request, 'register.html', {'state': state})

        username_exists = User.objects.filter(username=username).exists()
        # 判断用户名是否已被注册
        if username_exists:
            state = '该用户名已被注册,请登录!'
        else:
            # 执行注册
            # create_user()方法对密码参数进行哈希处理
            user = User.objects.create_user(username=username,
                                            password=password)
            # 3、保存注册数据
            user.save()
            state = '注册成功,请登录!'
            # 4、返回注册结果，在第10次课有登录页面时使用
            return redirect(reverse('auth_app:login') + '?state={}'.format(state))
            # 注册时的重定向
            # reverse如果有应用命名空间或者有实例命名空间，那么应该在反转的时候加上命名空间
        return redirect(reverse('auth_app:register') + '?state={}'.format(state))


# 用户登录
class LoginView(View):
    def get(self, request):
        return render(request, "login.html")

    """用户名登录"""

    def post(self, request):
        username = request.POST['username']  # Django自带的用户认证后端，默认是使用用户名实现用户认证
        password = request.POST['password']  # Django自带的用户认证后端，默认是使用用户名实现用户认证
        user = authenticate(username=username, password=password)
        if user is not None:
            login(request,
                  user)  # login()函数根据用户信息，生成sessionid，这个sessionid是必须保存在数据库当中的，因为需要在用户登陆后，查询session，取出用户基本信息（session_data）
            # return redirect(reverse('goods:index'))
            res = redirect(reverse('goods:index'))
            res.set_cookie('userid', user.id, max_age=60 * 90)
            return res
        else:
            return render(request, 'login.html', {'account_errmsg': '用户名或密码错误'})


# 首页相关视图函数
class IndexView(View):
    def get(self, request):
        return render(request, 'index.html')


# 修改密码
class SetPasswordView(View):
    def get(self, request):
        # 渲染修改密码模板
        return render(request, 'set_password.html')

    def post(self, request):
        # 提取用户名、密码和确认密码
        username1 = request.POST.get('username', '')
        password = request.POST.get('password', '')
        check_password = request.POST.get('check_password', '')
        user = User.objects.filter(username=username1).first()
        if user:
            if password != check_password:
                state = '两次密码输入不一致，请重新输入！'
                return render(request, 'set_password.html', {'state': state})
            else:
                # 密码加密
                user.set_password(password)
                user.save()
                state = '新密码设置成功，请登录！'
                return redirect(reverse('auth_app:login') + '?state={}'.format(state))
        else:
            state = '输入用户名不存在'
            return render(request, 'set_password.html', {'state': state})


# 使用django自带的装饰器 @login_required
@login_required()
def user_center(request):
    # 渲染用户中心模板
    return render(request, 'userinfo.html')


# logout()函数实现用户退出功能
class LogoutView(View):
    """退出登录"""

    def get(self, request):
        # 和登录相反（清理session会话信息）
        logout(request)
        # 重定向到登录页面
        return redirect(reverse('auth_app:login'))
